"""
参数化流程：
1. 导包
from parameterized import parameterized
2. 定义参数化数据
params_data = [
    ('登陆成功', {'mobile': '13800000002', 'password': '123456'},
     {'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}),
    ('用户名错误', {'mobile': '13800003342', 'password': '123456'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}),
    ('密码错误', {'mobile': '13800000002', 'password': '123456abc'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'})
]
3. 参数化测试
@parameterized.expand(params_data)
def test_login(self, desc, body, expect_result):
    pass

参数化说明
1. 参数化数据和测试方法形参关系：元组元素和形参一一对应
params_data = [(元素1，元素2，元素3, ……), (), (), ()]
@parameterized.expand(params_data)
def test_login(self, 形参1, 形参2, 形参3, ……):
    pass
2. 测试方法执行的次数和列表[]中元素个数相匹配，即列表中有n个元素，测试方法执行n次
3. pycharm点击运行，不能点击方法名的位置，只能点击类名的位置
"""
import unittest
from parameterized import parameterized
from login_api import LoginApi

params_data = [
    ('登陆成功', {'mobile': '13800000002', 'password': '123456'},
     {'status_code': 200, 'success': True, 'code': 10000, 'message': '操作成功'}),
    ('用户名错误', {'mobile': '13800003342', 'password': '123456'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'}),
    ('密码错误', {'mobile': '13800000002', 'password': '123456abc'},
     {'status_code': 200, 'success': False, 'code': 20001, 'message': '用户名或密码错误'})
]

class TestLogin(unittest.TestCase):
    @parameterized.expand(params_data)
    def test_login(self, case_name, body, expect):
        # 登录请求
        resp = LoginApi().login(body)
        resp_data = resp.json()

        # 断言
        self.assertEqual(expect.get('status_code'), resp.status_code)
        self.assertEqual(expect.get('success'), resp_data.get('success'))
        self.assertEqual(expect.get('code'), resp_data.get('code'))
        self.assertIn(expect.get('message'), resp_data.get('message'))
